package org.stars.daostars.starterkit;

import java.util.StringTokenizer;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.stars.config.AppSettings;
import org.stars.util.StringUtility;

/**
 * Servlet implementation class for Servlet: Startup
 *
 */
public class Startup extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
	
	/**
	 * serial id
	 */
	private static final long serialVersionUID = -5389094300625711650L;
	
	/**
	 * logger della classe
	 * @return
	 * 		logger
	 */
	public Log getLog()
	{
		return LogFactory.getLog(Startup.class);
	}
	
	/**
	 * Inizializzazione del servlet.
	 * 
	 * @param config
	 * @throws javax.servlet.ServletException
	 */
    @Override
	public void init(ServletConfig config)
        throws ServletException
    { 
        super.init(config);
        				
        //----------------------------------------------------------------------
        // Definiamo il path
        //----------------------------------------------------------------------
        String sPath =   getServletContext().getRealPath("/");                
        sPath        =   StringUtility.replaceString(sPath,"\\","/");
        // togliamo il carattere / finale
        if (sPath.endsWith("/") && (sPath.length()>1)) sPath=sPath.substring(0,sPath.length()-1);
        
        //----------------------------------------------------------------------
        // Definiamo CONTEXT-PATH
        //----------------------------------------------------------------------
        String sContextPath;
        try {
        sContextPath=getContextPath();
        } catch(Exception e)
        {
            sContextPath="";
        }        			
		
        AppSettings as=AppSettings.getInstance();
        
        as.setPath(sPath); // impostiamo il base path
		as.setContextPath(sContextPath); // impostiamo il base path
                                             
        //----------------------------------------------------------------------
        // Recuperiamo le definizioni del codice Sql per i Dao
        //----------------------------------------------------------------------
        try
        {
        	DaoStarterKitConfigurator loader=DaoStarterKitConfigurator.getInstance();        	
        	loader.loadAllConfiguration(sPath);
        }
        catch(Exception e)
        {
        	Log log=getLog();
            log.fatal("There was a problem during the startup of the DaoStarterKit: "+e.toString());
        }

    }

    /* (non-Javadoc)
     * @see javax.servlet.GenericServlet#destroy()
     */
    @Override
	public void destroy()
    {
        super.destroy();     
    }
    
    /** Recupera il path del contesto. Dalle prove effettuate il
     * context path viene rappresentato in una forma tipo<BR>
     * <B>jndi:/localhost/ws/</B><BR>
     * Per ottenere il path corretto dividiamo la stringa in varie sottostringhe
     * mediante il delimitatore "/". L'ultima sottostringa rappresenta il
     * vero path del servlet context.
     *
     *
     * @return context path
     */    
    private String getContextPath()
    {
    	Log log=getLog();
        String sLastToken="";
        String s;
        try
        {
            s=getServletContext().getResource("/").toString();
                
            log.debug("Path recuperato: "+s);
        
        if (s.indexOf("jndi:")==-1)
        {   // caso OC4J, non funziona il metodo normale, molto probabilmente compare
            // il percorso fisico del file. Per fare in modo che funzioni, facciamo in modo
            // da prendere solo l'ultimo token
            StringTokenizer st=new StringTokenizer(s,"/");
            String sApp;
            
            log.debug("Analisi path del tipo OCJ");
            
            while (st.hasMoreTokens())
            {
                sApp=st.nextToken();
                if (sApp.length()>0)
                {
                    sLastToken=sApp;
                }
            }
            // aggiungiamo la barra iniziale
            sLastToken="/"+sLastToken;
            // s=sLastToken;
            
        }
        else
        {
        	log.debug("Analisi path del tipo TOMCAT");
            
            s=StringUtility.replace(s,"jndi:/localhost","");
            if (s.endsWith("/"))
            {
                s=s.substring(0,s.length()-1);

            }                      
            // La barra iniziale già c'è.
            sLastToken=s;
        }
        
        
        // facciamo in modo di prendere tutto a parte
        } catch(Exception e){ /* do nothing */}
                        
        log.debug("Context path recuperato: "+sLastToken);
        return sLastToken;
    }

}